home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Original Shareware 1.1
/
The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso
/
22
/
dumphp.zip
/
DUMPHP.ASM
next >
Wrap
Assembly Source File
|
1986-10-02
|
6KB
|
191 lines
TITLE DUMP HP
; Dumps graphics on the HP LaserJet
PRINT MACRO MESSAGE ;PRINT A MESSAGE ON THE PRINTER
LOCAL BACK,DONE
PUSH AX
LEA SI,MESSAGE
BACK: LODSB
CMP AL,'$' ;STRING TERMINATER
JE DONE
MOV DX,0
MOV AH,1
INT 14H
JMP BACK
DONE:
POP AX
ENDM
INTERRUPTS SEGMENT AT 0H ;THIS IS WHERE THE SCREEN_DUMP INTERRUPT
ORG 5H*4 ;IS LOCATED
SCREEN_DUMP_INT LABEL DWORD
INTERRUPTS ENDS
CODESEG SEGMENT
ASSUME CS:CODESEG
ORG 100H ;ORG = 100H TO MAKE THIS INTO A .COM FILE
FIRST: JMP INIT ;FIRST TIME THROUGH JUMP TO INITIALIZE ROUTINE
PRTSC PROC NEAR ;THE SCREEN_DUMP INTERRUPT WILL NOW COME HERE.
ASSUME CS:CODESEG
PUSH AX ;SAVE THE USED REGISTERS FOR GOOD FORM
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH DS
PUSH ES
JMP OVER ;JUMP OVER DATA
;---------------------------------------------------------------
OLD_PRTSC_INT DD ? ;OLD DUMP ROUTINE
DOWN DB 0 ;DISTANCE DOWN
XXX DW 0 ;CURRENT SCAN LINE
SETUP DB 27,'*t100R' ;100 DPI GRAPHICS MODE
DB 27,'*r2A' ;START RASTER GRAPHICS
DB '$'
READY DB 27,'&a+1V' ;MOVE DOWN 1 DECIPOINT
DB 27,'*b80W' ;GET READY FOR 80 BYTES
DB '$'
ENDG DB 27,'*rB' ;END RASTER GRAPHICS
DB '$'
;---------------------------------------------------------------
OVER: ASSUME DS:CODESEG,ES:NOTHING
MOV AX,0B800H ;FIX EXTRA SEGMENT REISTER
MOV ES,AX ;TO POINT TO GRAPHICS SCREEN
MOV AX,CS ;FIX DATA SEGMENT REGISTER
MOV DS,AX ;TO POINT TO CODE SEGMENT
MOV AH,0FH ;READ VIDEO MODE
INT 10H
CMP AL,7 ;MONOCHROME?
JE OLD_DUMP ;YES -- USE OLD SCREEN DUMP ROUTINE
CMP AL,3 ;TEXT MODE?
JG START ;NO -- USE NEW SCREEN DUMP ROUTINE
OLD_DUMP: PUSHF ;SAVE THE FLAGS
CALL OLD_PRTSC_INT ;CALL OLD ROUTINE
JMP OUT ;RETURN TO CALLER
;----- IF WE ARE HERE, WE MUST BE IN GRAPHICS MODE -----;
START: PRINT SETUP ;SETUP PRINTER
MOV DOWN,0 ;START AT 0 DOWN
MOV XXX,0 ;COLUMN NUMBER
NEXTROW: MOV CX,3 ;PRINT EACH ROW THREE TIMES
ITERATION1: PRINT READY ;READY GRAPHICS
MOV DI,XXX ;GET STARTING LOCATION
PUSH CX ;SAVE CX
MOV CX,80 ;DO THIS 80 TIMES
LOOP1: MOV AL,ES:[DI] ;READ BYTE INTO DL
MOV DX,0 ;PRINT BYTE
MOV AH,1
INT 14H
ELOOP1: INC DI ;GET NEXT BYTE
LOOP LOOP1
POP CX ;GET CX BACK
PRINT ENDG ;END RASTER GRAPHICS
LOOP ITERATION1 ;DO THIS THREE TIMES
MOV CX,80 ;REVERSE 80 BYTES
MOV DI,XXX ;GET LOCATION
RLOOP1: MOV AL,ES:[DI] ;READ BYTE
XOR AL,11111111B ;REVERSE BYTE
MOV ES:[DI],AL ;WRITE IT
INC DI ;GET NEXT LOCATION
LOOP RLOOP1
MOV CX,3 ;DO THREE TIMES
ITERATION2: PRINT READY ;READY GRAPHICS
MOV DI,XXX ;GET STARTING LOCATION
ADD DI,8192 ;DO NEXT ROW
PUSH CX ;SAVE CX
MOV CX,80 ;DO THIS 80 TIMES
LOOP2: MOV AL,ES:[DI] ;READ BYTE INTO DL
MOV DX,0 ;PRINT BYTE
MOV AH,1
INT 14H
ELOOP2: INC DI ;GET NEXT BYTE
LOOP LOOP2
POP CX ;GET CX BACK
PRINT ENDG
LOOP ITERATION2 ;DO IT AGAIN
MOV CX,80 ;REVERSE 80 BYTES
MOV DI,XXX ;GET LOCATION
ADD DI,8192 ;UPDATE IT
RLOOP2: MOV AL,ES:[DI] ;READ BYTE
XOR AL,11111111B ;REVERSE BYTE
MOV ES:[DI],AL ;WRITE IT
INC DI ;GET NEXT LOCATION
LOOP RLOOP2
ADD XXX,80 ;MOVE DOWN TO NEXT SCAN LINE
INC DOWN ;INCREMENT DOWN COUNTER
CMP DOWN,100
JGE RESET ;DONE -- RESET SCREEN
LEA AX,NEXTROW ;DO NEXT ROW
JMP AX
RESET: MOV CX,03FFFH ;RE-REVERSE SCREEN
XOR DI,DI ;START AT 0
LOOP3: MOV AL,ES:[DI] ;GET BYTE
XOR AL,11111111B ;REVERSE IT
MOV ES:[DI],AL ;WRITE IT
INC DI
LOOP LOOP3 ;GET NEXT
OUT: POP ES ;POP FLAGS FROM STACK
POP DS
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
IRET ;RETURN TO CALLER
PRTSC ENDP
INIT PROC NEAR ;THIS PROCEDURE INTIALIZES EVERYTHING
JMP HERE ;JUMP OVER DATA
MSG1: DB 13,10
DB 'DUMP GRAPHICS ONTO THE HP LASERJET PRINTER',13,10
DB ' by Scott Pakin',13,10,10
DB 'Press <shift> <PrtSc> to dump the graphics screen.',13,10
DB 'Text modes will print using the regular screen dump routine.'
DB 13,10
DB '$'
HERE: LEA DX,MSG1 ;PRINT INITIAL MESSAGE
MOV AH,9
INT 21H
ASSUME DS:INTERRUPTS ;THE DATA SEGMENT WILL BE THE INTERRUPT AREA
MOV AX,INTERRUPTS
MOV DS,AX
MOV AX,SCREEN_DUMP_INT ;STORE OLD LOCATION
MOV OLD_PRTSC_INT,AX
MOV AX,SCREEN_DUMP_INT[2]
MOV OLD_PRTSC_INT[2],AX
MOV SCREEN_DUMP_INT,OFFSET PRTSC ;NOW LOAD THE ADDRESS OF OUR NOTEPAD
MOV SCREEN_DUMP_INT[2],CS ;ROUTINE INTO THE SCREEN_DUMP INTERRUPT
EXIT: MOV DX,OFFSET INIT ;SET UP EVERYTHING BUT INIT TO
INT 27H ;STAY AND ATTACH ITSELF TO DOS
INIT ENDP
CODESEG ENDS
END FIRST ;END "FIRST" SO 8088 WILL GO TO FIRST FIRST.